﻿using System;
using System.Collections.Generic;
using System.Data;
using accesoDatos;
using clasesBase;

namespace Logica
{
    public class PlanificacionProd : EntidadAlmacenable
    {
        /* --------------------- Atributos de la clase. Recordar que hay atributos heredados --------------------- */
        private string nombre = "";
        private int idEstado = 0, numero=0;
        private EstadoPlanificacion objEstado;
        private DateTime fecha = ValoresGlobales.FechaMinima;

        private List<ItemPlanificacionProduccion> items;

        public const string tablaBD = "planificacionproduccion", columnaID = "id";


        /* --------------------- Propiedades --------------------- */
        public int ID
        {
            get { return this.id; }
            set { this.id = value; }
        }

        public string Nombre
        {
            get { return this.nombre; }
            set { this.nombre = value; }
        }

        public DateTime Fecha
        {
            get { return this.fecha; }
            set { this.fecha = value; }
        }

        public int Numero
        {
            get { return this.numero; }
            set { this.numero = value; }
        }

        public EstadoPlanificacion ObjEstado
        {
            get { return objEstado; }
            set
            {
                objEstado = value;
                this.idEstado = this.objEstado.ID;
            }
        }

        public List<ItemPlanificacionProduccion> Items
        {
            get { return this.items; }
            set { this.items = value; }
        }


        /* --------------------- Constructores --------------------- */
        public PlanificacionProd()
            : this(0, true) // Llamo al constructor que recibe un parámetro para reutilizar el código del mismo
        { }

        public PlanificacionProd(int idElem)
            : this(idElem, true) // Llamo al constructor que recibe un parámetro para reutilizar el código del mismo
        { }

        /* IMPORTANTE:
             ** Si el campo identificador unívoco de la tabla actual tuviese un nombre distinto de "id", se lo debe setear en este momento
             * (atributo heredado: nombreColumnaID)
             ** Si el campo identificador unívoco NO se generase automáticamente, se lo debe definir en este momento, cambiando el atributo
             * heredado idAutoGenerado por FALSE.
             */
        public PlanificacionProd(int idElem, bool cargarLista)
            : base() // Llamo al constructor padre en primer lugar, para inicializar los valores correspondientes
        {
            // Es importante esta asignación ya que estos valores se utilizan tanto en métodos del objeto padre como éste
            this.nombreTablaBD = tablaBD;
            this.nombreColumnaID = columnaID;
            this.id = idElem;

            this.relacionesOtrasTablas.Add(ItemPlanificacionProduccion.tablaBD, "idPlanificacionProduccion");

            // Si se hubiese enviado un id != 0, entonces se buscan los datos del elemento en la BD para cargarlos al objeto actual que se está creando
            if (this.id != 0)
            {
                DataRow elemento = this.buscarElemento(id);
                try
                {
                    this.nombre = elemento["nombre"].ToString().Trim();
                    this.idEstado = Convert.ToInt32(elemento["idEstado"]);
                    this.numero = Convert.ToInt32(elemento["numero"]);
                    this.fecha = Convert.ToDateTime(elemento["fecha"]);
                }
                catch (Exception ex)
                {
                    this.error = ex.Message;
                }
            }

            if (cargarLista) cargarColeccion();
            else
            {
                this.items = new List<ItemPlanificacionProduccion>();
            }

            this.objEstado = new EstadoPlanificacion(this.idEstado);
        }

        public void cargarColeccion()
        {
            this.items = ItemPlanificacionProduccion.listar(new string[] { "idPlanificacionProduccion" }, new string[] { "E" + this.id.ToString() });
        }


        /* --------------------- Métodos --------------------- */
        public static DataTable listaExtendida(string[] columnasFiltros, string[] valoresFiltros)
        {
            string camposConsulta = string.Format("{0}.*, {1}.nombre as Estado", tablaBD, EstadoPlanificacion.tablaBD);
            string[] tablasJoin = new string[] { string.Format("join {1} on {0}.idEstado = {1}.{2}", tablaBD, EstadoPlanificacion.tablaBD, EstadoPlanificacion.columnaID) };

            ManejadorBD manejador = new ManejadorBD();
            DataSet conjuntoDatos = manejador.obtenerDatos(camposConsulta, tablaBD, tablasJoin, columnasFiltros, valoresFiltros, new string[] { });

            DataTable datosListado;
            if (conjuntoDatos.Tables.Count > 0) datosListado = conjuntoDatos.Tables[0];
            else datosListado = new DataTable("Tabla");

            return datosListado;
        }

        public static int proximoNumero()
        {
            ManejadorBD manejadorBD = new ManejadorBD();

            string consultaSQL = string.Format("SELECT MAX(numero) AS maximo FROM {0}", PlanificacionProd.tablaBD);
            int maximo = manejadorBD.obtenerNumeroEntero(consultaSQL);
            int proximo = maximo + 1;
            return proximo;
        }

        public String guardar()
        {
            String[] columnas = new String[] { columnaID, "nombre", "idEstado", "numero", "fecha" };
            String[] valores = new String[] { this.id.ToString(), this.nombre.Trim(), this.idEstado.ToString(), this.numero.ToString(), Validador.formatearFecha(this.fecha) };

            string error = base.guardarElemento(columnas, valores);
            if (error.Equals("")) // Si se guardó correctamente la planificacion, continúo y guardo los items
            {
                string errorItem = "";
                foreach (ItemPlanificacionProduccion item in this.items)
                {
                    item.IdPlanificacionProduccion = this.id;
                    errorItem = " " + item.guardar();
                }
                if (!errorItem.Trim().Equals("")) error += "Errores ocurridos al insertar los ítems: " + errorItem;
            }

            return error;
        }
    }
}